package patterns.principles;

import lombok.extern.slf4j.Slf4j;

/**
 * 单一职责原则(Single Responsibility Principle, SRP)示例
 * 一个类应该只有一个引起它变化的原因
 */
@Slf4j
public class SingleResponsibilityPrinciple {

    public static void main(String[] args) {
        // 不符合SRP的例子
        UserBad user = new UserBad("张三", "zhangsan@example.com");
        user.saveUser(); // 这个类既包含用户属性，又负责数据存储，职责不单一
        
        // 符合SRP的例子
        User goodUser = new User("李四", "lisi@example.com");
        UserRepository repository = new UserRepository();
        repository.save(goodUser); // 数据存储的职责被分离到专门的类中
        
        // 使用UserService进一步体现SRP
        UserService userService = new UserService(repository);
        userService.registerUser("王五", "wangwu@example.com");
    }
}

/**
 * 不符合单一职责原则的用户类
 * 既包含用户数据，又负责数据存储逻辑
 */
class UserBad {
    private String name;
    private String email;
    
    public UserBad(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    public String getName() {
        return name;
    }
    
    public String getEmail() {
        return email;
    }
    
    // 数据存储逻辑不应该在用户类中
    public void saveUser() {
        System.out.println("保存用户数据: " + name + ", " + email);
        // 假设这里有数据库操作代码
        validateEmail(); // 邮箱验证逻辑也混在这个类中
    }
    
    // 邮箱验证逻辑也不应该在这里
    private boolean validateEmail() {
        System.out.println("验证邮箱: " + email);
        return email != null && email.contains("@");
    }
}

/**
 * 符合单一职责原则的用户类
 * 只包含用户数据，不负责业务逻辑
 */
class User {
    private String name;
    private String email;
    
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    public String getName() {
        return name;
    }
    
    public String getEmail() {
        return email;
    }
    
    @Override
    public String toString() {
        return "User{name='" + name + "', email='" + email + "'}";
    }
}

/**
 * 用户数据存储类
 * 专门负责用户数据的持久化
 */
class UserRepository {
    public void save(User user) {
        System.out.println("保存用户到数据库: " + user);
        // 假设这里有数据库操作代码
    }
    
    public User findByEmail(String email) {
        System.out.println("通过邮箱查找用户: " + email);
        // 假设这里有数据库查询代码
        return null;
    }
}

/**
 * 邮箱验证工具类
 * 专门负责邮箱验证逻辑
 */
class EmailValidator {
    public static boolean isValid(String email) {
        System.out.println("验证邮箱格式: " + email);
        return email != null && email.contains("@");
    }
}

/**
 * 用户服务类
 * 负责用户相关的业务逻辑
 */
class UserService {
    private final UserRepository userRepository;
    
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    public void registerUser(String name, String email) {
        // 验证邮箱
        if (!EmailValidator.isValid(email)) {
            System.out.println("邮箱格式无效: " + email);
            return;
        }
        
        // 检查邮箱是否已存在
        User existingUser = userRepository.findByEmail(email);
        if (existingUser != null) {
            System.out.println("邮箱已被注册: " + email);
            return;
        }
        
        // 创建并保存用户
        User newUser = new User(name, email);
        userRepository.save(newUser);
        System.out.println("用户注册成功: " + newUser);
    }
} 